#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <vector>
#include <thread>

QT_BEGIN_NAMESPACE
namespace Ui
{
    class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget* parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow* ui;

private:
    /**
     * @brief 产生随机数的线程
     */
    std::thread generateThread;
    /**
     * @brief 产生之后排序的随机数
     * @param count 随机数的个数
     */
    void generateRandomNumber(int count);

    /**
     * @brief 要快速排序的数据
     */
    std::vector<int> quickData;
    /**
     * @brief 进行快速排序的线程
     */
    std::thread quickThread;
    /**
     * @brief 快速排序并统计运行时间
     * @param dataVector 要排序的数组
     */
    void quickSort(std::vector<int>& dataVector);

    /**
     * @brief 冒泡排序的数据
     */
    std::vector<int> bubbleData;
    /**
     * @brief 进行冒泡排序的线程
     */
    std::thread bubbleThread;
    /**
     * @brief 冒泡排序并统计运行时间
     * @param dataVector 要排序的数组
     */
    void bubbleSort(std::vector<int>& dataVector);

    /**
     * @brief 等待所有线程完成
     */
    void waitForAllThreads(void);

signals:

    /**
     * @brief 随机数生成完毕
     * @note Qt 信号
     */
    void generateAccomplish(void);

    /**
     * @brief 快速排序完成
     * @note Qt 信号
     */
    void quickSortAccomplish(void);

    /**
     * @brief 冒泡排序完成
     * @note Qt 信号
     */
    void bubbleSortAccomplish(void);
};
#endif // MAINWINDOW_H
